[Step Functions]Paralellステートで入力パラメータに基づいて分岐する並列処理を実装する
はじめに
Step Fucntions には Paralell ステートという並列実行を行うためのステートがあります。これを使うことで、複数の処理を同時に行うことができるため、処理時間の短縮が可能です。
Paralell ステートの詳細については以下をご参照ください。
今回はこの Paralell ステートを使って並列実行する際、入力のパラメータから実行する処理を分けたいケースがあったので試してみました。
やってみる
実装
実装自体は本題ではないので CDKv2 を使ってパパッと構築します。
参考までにコードは以下のような感じに記述しました。
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; export class SfnParalellStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const choiceStateA = new sfn.Choice(this, 'Choice State A') .when(sfn.Condition.booleanEquals('$.isA', true), new sfn.Succeed(this, 'functionA')) .otherwise(new sfn.Succeed(this, 'passA')); const choiceStateB = new sfn.Choice(this, 'Choice State B') .when(sfn.Condition.booleanEquals('$.isB', true), new sfn.Succeed(this, 'functionB')) .otherwise(new sfn.Succeed(this, 'passB')); const choiceStateC = new sfn.Choice(this, 'Choice State C') .when(sfn.Condition.booleanEquals('$.isC', true), new sfn.Succeed(this, 'functionC')) .otherwise(new sfn.Succeed(this, 'passC')); const definition = new sfn.Parallel(this, 'Parallel State') .branch(choiceStateA) .branch(choiceStateB) .branch(choiceStateC); new sfn.StateMachine(this, 'StateMachine', { definitionBody: sfn.DefinitionBody.fromChainable(definition), }); } }
これをデプロイすると、こんな感じの定義になります。
インプットから処理を分岐させる
Paralell ステート内には 3 つの Choice ステートに分岐しており、それぞれ実行したい処理(function)と pass ステートに分岐させています。
このように Paralell 内でやりたい処理に対して Choice ステートを 1:1 で用意することで、入力のパラメータから実行する処理を分岐させています。
例えば、functionA
だけを実行したい場合は、以下の入力で実行します。
{ "isA": true, "isB": false, "isC": false }
Choice State A
では入力の"isA": true
が評価されるため functionsA が実行、それ以外は false のため、B と C は pass になっていますね。
functionB
とfunctionC
を同時に実行したい場合は、isB
とisC
の値は true にします。
{ "isA": false, "isB": true, "isC": true }
functionA は pass になっており、functionB と C は実行されています。入力を true にするだけなのでシンプルですね。
パラメータがない場合
当たり前ですが入力のパラメータがない場合は、Choice ステップでエラーになります。isC
を消した入力で実行してみます。
{ "isA": false, "isB": true }
Choice State C
の判定で、使用するisC
が見つからないためエラーとなりました。この時 Paralell は並列で実行している処理全てが中断されます。
そのためこの実装を行う場合は、Paralell ステートの入力を決めておきましょう。
まとめ
Paralell ステートを使って入力のパラメータから並列処理の対象を分岐してみました。かなりシンプルに実装できるので Paralell ステートを使う時の参考にして頂ければ幸いです。